package model;

import static util.Constants.BLANK_SYMBOL;
import model.iview.ITile;

/**
 * Cette classe représente une tuile du jeu, c'est-à-dire une pièce que l'on
 * peut tirer du sac et poser sur le plateau de jeu.
 * 
 * @author Lucile Gramusset et Guillaume Poussel
 * 
 */
public class Tile implements ITile {

    /**
     * La lettre de la tuile. Pour les jokers, ils ont la valeur BLANK tant
     * qu'ils ne sont pas utilisés.
     */
    private Letter letter;

    /**
     * Score de cette lettre défini en fonction des règles du jeu de Scrabble
     */
    private int score;

    /**
     * Détermine si la lettre était un joker avant de prendre une "vraie" lettre
     */
    private boolean oldJoker;

    /**
     * Construit une tuile avec un score de 0 à partir de la lettre
     * 
     * @param letter
     *            Lettre de la tuile
     */
    public Tile(Letter letter) {
        this(letter, 0);
    }

    /**
     * Construit une tuile avec le score et la lettre donné en paramètre
     * 
     * @param letter
     *            La lettre de la tuile
     * @param score
     *            Le score de la tuile
     */
    public Tile(Letter letter, int score) {
        this.letter = letter;
        this.score = score;
        this.oldJoker = (letter == Letter.BLANK);
    }

    /* (non-Javadoc)
     * @see model.ITile#getLetter()
     */
    public Letter getLetter() {
        return letter;
    }

    /* (non-Javadoc)
     * @see model.ITile#getScore()
     */
    public int getScore() {
        return score;
    }

    /**
     * Cette méthode permet de définir la lettre d'utilisation d'un joker. Si
     * cette méthode est appliqué sur une lettre qui n'est pas un joker, elle ne
     * fait rien
     * 
     * @param newLetter
     *            La nouvelle valeur du joker
     */
    public void setLetter(Letter newLetter) {
        if (letter.equals(Letter.BLANK)) {
            letter = newLetter;
            this.oldJoker = true;
        }
    }

    /* (non-Javadoc)
     * @see model.ITile#isOldJoker()
     */
    public boolean isOldJoker() {
        return oldJoker;
    }

    /**
     * Représente une tuile sous la forme d'une chaîne de caractères
     */
    public String toString() {
        return "[" + (oldJoker ? "@" : "")
                + (letter.equals(Letter.BLANK) ? BLANK_SYMBOL : letter) + ";"
                + score + "]";
    }

    @Override
    public void clearJokerValue() {
        if (oldJoker) {
            letter = Letter.BLANK;
        }
    }
}
